package com.agan.aganalgorithm.stack;

import java.util.Stack;

/**
 * @author agan
 * @ClassName ExpUtil
 * @Description
 * @Date 2020/11/18 6:03 下午
 **/
public class ExpUtil {

    /**
     * 判断括号的规则是否正确 （）
     * 有一个左括号必须有对应右括号，且顺序正确
     * @param args
     */
    public static void main(String[] args) {

        String exp = "中国(5G+运营商|咨询)";
        //System.out.println(isLegal(exp));
        System.out.println(isRightLegal(exp));

    }


    /**
     *  表达式校验是否合法
     *  是否满足只包含 数字 字母 汉字 + | ( )
     *  " + | )" 不能为开头
     *  " + | (" 不能为结尾
     *  () 括号要对称。
     *  注意() 括号为英文括号
     * @param exp
     * @return
     */
    public static boolean isRightLegal(String exp){
        if(isFirst(exp) ==1 && isEnd(exp) == 1 && isRightChar(exp) && isLegal(exp)){
            //满足前置条件
            System.out.println("满足条件");
            return true;
        }
        System.out.println("不满足条件");
        return false;
    }




    /**
     * 是否满足只包含 括号汉字. " + | )" 不能为开头," + | ("不能为结尾
     * 英文括号 ()
     */
    public static boolean isRightChar(String exp){
        //数字 字母 汉字 + | ( )
        String pattern = "^[a-z0-9A-Z\\u4e00-\\u9fa5+|()]+$";
        return exp.matches(pattern);
    }

    /**
     * 首字符不符合
     * @param
     * @return
     */
    public static int isFirst(String exp){
        if(exp.startsWith(")") || exp.startsWith("+") || exp.startsWith("|")){
            return 0;
        }else {
            return 1;
        }
    }

    /**
     * 结尾字符不符合
     * @param
     * @return
     */
    public static int isEnd(String exp){
        if(exp.endsWith("(") || exp.endsWith("+") || exp.endsWith("|")){
            return 0;
        }else {
            return 1;
        }
    }

    /**
     * 左节点入栈
     * @param c
     * @return
     */
    public static int isLeft(char c){
        if(c == '('){
            return 1;
        }else {
            return 0;
        }
    }
    /**
     * 右节点出栈
     * @param c
     * @return
     */
    public static int isRight(char c){
        if(c == ')'){
            return 1;
        }else {
            return 0;
        }
    }

    /**
     * 括号是否匹配
     * @param p
     * @param curr
     * @return
     */
    public static int isPair(char p,char curr){
        if(p == '(' && curr ==')'){
            return 1;
        }
        return 0;
    }

    public static Boolean isLegal(String exp){
        Stack stack = new Stack();
        for (int i=0;i<exp.length();i++){
            char curr = exp.charAt(i);
            if(isLeft(curr)== 1){
                stack.push(curr);
            }
            if(isRight(curr) == 1){
                if(stack.empty()){
                    System.out.println("非法");
                    return false;
                }
                char p = (char) stack.pop();
                if(isPair(p,curr) == 0){
                    System.out.println("非法");
                    return false;
                }
            }
        }
        if (stack.empty()) {
            System.out.println("合法");
            return true;
        } else {
            System.out.println("非法");
            return false;
        }

    }
}
